package tech.waterism.topo.model;

import lombok.Data;

import java.util.Date;

/**
 * 时序数据
 * 
 * <p>表示某个时刻的水文/调度数据（流量、水位、库容等）
 * 
 * @author waterism
 * @since 1.0.0
 */
@Data
public class TimeSeriesData {
    
    /** 时间 */
    private Date dt;
    
    // ========== 实测数据 ==========
    /** 实测流量 (m³/s) */
    private Double q;
    
    /** 实测水位 (m) */
    private Double rz;
    
    /** 实际流量（用于联调） */
    private Double qReal;
    
    // ========== 预报数据 ==========
    /** 预报流量 (m³/s) */
    private Double qSim;
    
    /** 预报准备流量（用于蓄滞洪区） */
    private Double qPrep;
    
    // ========== 调度数据 ==========
    /** 入库流量 (m³/s) */
    private Double qIn;
    
    /** 出库流量 (m³/s) */
    private Double qOut;
    
    /** 库容 (万m³) */
    private Double v;
    
    // ========== 分洪排洪数据 ==========
    /** 分洪流量 (m³/s) - 从河道分流到蓄滞洪区 */
    private Double qDvr;
    
    /** 排洪流量 (m³/s) - 从蓄滞洪区排回河道 */
    private Double qDsc;
    
    // ========== 闸门数据 ==========
    /** 闸门开度矩阵 [设备数][开度档位数] */
    private Integer[][] nUsedGates;
    
    /** 泄流方式：0=水位反推, 1=指定出流, 2=闸门开度 */
    private Integer flowWay;
    
    /**
     * 累加预报流量
     * 
     * @param qSim 要累加的流量
     */
    public void addQSim(Double qSim) {
        if (qSim != null) {
            this.qSim = (this.qSim == null ? 0.0 : this.qSim) + qSim;
        }
    }
    
    /**
     * 累加预报准备流量
     * 
     * @param qPrep 要累加的流量
     */
    public void addQPrep(Double qPrep) {
        if (qPrep != null) {
            this.qPrep = (this.qPrep == null ? 0.0 : this.qPrep) + qPrep;
        }
    }
    
    /**
     * 检查时间是否在指定时间之后
     * 
     * @param time 参考时间
     * @return true表示在参考时间之后
     */
    public boolean isAfter(Date time) {
        return dt != null && time != null && dt.after(time);
    }
    
    /**
     * 检查时间是否在指定时间之前
     * 
     * @param time 参考时间
     * @return true表示在参考时间之前
     */
    public boolean isBefore(Date time) {
        return dt != null && time != null && dt.before(time);
    }
}

